perm filename GILFOC.SAI[SYS,HE] blob sn#004270 filedate 1972-08-25 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00007 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	BEGIN "GILFOC"
 00004 00003	PROCEDURE FOCDRAW(REAL EST_RANG,RANGINVAL INTEGER NCUT)
 00006 00004	    PROCEDURE TVSCREEN(REFERENCE INTEGER MAXGRADL,AV)
 00009 00005	       ⊃ MAIN BODY OF FOCDRAW
 00013 00006	       IF DIS_FOC THEN BEGIN
 00016 00007	  MESSAGE PROCEDURE AUTOFOC( REAL EST_RANG,RANGINVAL INTEGER NCUT)
 00017 ENDMK
⊗;
BEGIN "GILFOC"

DEFINE ⊃ ="COMMENT";

REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;

EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY X);
EXTERNAL PROCEDURE INTPNT;
EXTERNAL INTEGER CUT,TVWORD;
INTEGER ARRAY DPYBUF[1:400],TVBUF[1:100],HIST[0:15];
INTEGER DUMMY,EXFLAG,MESS,MAXI,MINI;

DEFINE  CRLF="&'15&'12", YES="INCHWL=""Y""", ⊃="COMMENT";
DEFINE WINDOW="X←0 STEP 1 UNTIL LOOK_AT[4]-1 DO
	       FOR Y←0 STEP 1 UNTIL LOOK_AT[5]-1";
DEFINE SWINDOW="X←1 STEP 1 UNTIL LOOK_AT[4]-2 DO
	        FOR Y←1 STEP 1 UNTIL LOOK_AT[5]-2";	

REQUIRE "TVSER.SAI[SYS,HE]" SOURCE_FILE;

PROCEDURE FOCDRAW(REAL EST_RANG,RANGINVAL; INTEGER NCUT);
  BEGIN "FOCDRAW" 
    ⊃ EST_RANG-the initial estimated range to the feature (inches).
      RANGEINVAL-the initial uncertainty of the range (inches).
      NCUT-required value of CUT. use .7*MAXGRADG if NCUT=-1;

    INTEGER MAXGRADG,J,I,N,FINEFOC,FOCSTRAT;
    REAL X,XMAX,XMIN,XDELTA,YMULT,XMULT,RANG,DOFREQ,SINVAL,DELF;
    LABEL BOUNDIN,XIT;
    INTEGER ARRAY MAGAV,MAXGRAD[0:10];
    REAL ARRAY DIST[0:10],PEAKMAG[1:3,1:2];

    ⊃ RANG-current estimate of range to feature.
      DELF-current estimate of uncertainty of range.
      DOFREQ-minimum attainable uncertainty of range.
      SINVAL-current search interval.
      MAXGRAD-max. abs. gradient at highest point of focus curve.
      FINEFOC-number of improvement cycles (max.. 3 are allowed)
      FOCSTRAT-set by ACOM_EVAL: 0-no contrast, 1-off center range,
               2-uncertainty improved, 3-no improvement.
      PEAKMAG-retains magnitude and range OF 3 highest points on
	      focus curve. used by ACOM_EVAL to judge accomodation.
    ;
    PROCEDURE TVSCREEN(REFERENCE INTEGER MAXGRADL,AV);
      ⊃ reads 4 TV frames. returns the average intensity;
      BEGIN "TVSCREEN" 
	REQUIRE "OP1.REL[SYS,HE]" LOAD_MODULE;
	EXTERNAL PROCEDURE OP1;
	EXTERNAL INTEGER PROCEDURE GETPNT (INTEGER X,Y);
	EXTERNAL PROCEDURE AVERAG;
	EXTERNAL INTEGER MAGSUM,NUMBR,TMPBUF;
	INTEGER ARRAY TEMBUF[1:250];

        NUMBR←4; TMPBUF←GIOWD(TEMBUF); MAGSUM←0; AVERAG;
        OP1;
	AV ← MAGSUM;
	   BEGIN INTEGER X,Y,M;
	         MAXGRADL←0;
 	         FOR SWINDOW DO
                 IF (M←GETPNT(X,Y))>MAXGRADL THEN MAXGRADL←M;
	   END;
      END "TVSCREEN";

    SIMPLE INTEGER PROCEDURE ACOM_EVAL;
      BEGIN REAL DELTX;
	IF PEAKMAG[1,1]=0 THEN BEGIN
        OUTSTR("ACOM_EVAL: INSUFF CONTRAST IN THIS RANGE"CRLF); RETURN(0); END;

	IF (ABS(PEAKMAG[1,2]-XMIN)≤2*XDELTA)∨(ABS(PEAKMAG[1,2]-XMAX)≤2*XDELTA) 
        THEN BEGIN OUTSTR("ACOM_EVAL: ORIGINAL RANGE WASN'T CENTERED"CRLF);
	   	   RANG←PEAKMAG[1,2]; RETURN(1); END;

        IF   PEAKMAG[2,1]<.9*PEAKMAG[1,1] 
        THEN DELTX←XDELTA
        ELSE IF   PEAKMAG[3,1]<.8*PEAKMAG[1,1] 
             THEN BEGIN DELTX←ABS(PEAKMAG[1,2]-PEAKMAG[2,2]);
		  RANG←(PEAKMAG[1,2]+PEAKMAG[2,2])/2; END
             ELSE BEGIN REAL T1,T2;
		  IF   (T1←ABS(PEAKMAG[1,2]-PEAKMAG[2,2]))>
	               (T2←ABS(PEAKMAG[1,2]-PEAKMAG[3,2]))
	          THEN BEGIN DELTX←T1;
	               RANG←(PEAKMAG[1,2]+PEAKMAG[2,2])/2; END
	          ELSE BEGIN DELTX←T2;
		       RANG←(PEAKMAG[1,2]+PEAKMAG[3,2])/2; END;
	          END;

	IF DELTX<DELF/2 THEN BEGIN DELF←2*DELTX; RETURN(2); END ELSE RETURN(3);

      END"ACOM_EVAL";
       ⊃ MAIN BODY OF FOCDRAW;

	 IF   NCUT<0 
         THEN MAXGRADG←6
	 ELSE IF  NCUT>15
	      THEN BEGIN OUTSTR("FOCDRAW: ILLEGAL CUT ("&CVS(NCUT)&")"CRLF);
			 EXFLAG←2; RETURN; END
              ELSE CUT←NCUT;

         DELF←RANGINVAL; RANG←EST_RANG; FOCSTRAT←FINEFOC←0;

BOUNDIN:
       DOFREQ←(RANG↑2)/(400*CAMLENS↑2);
       MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(RANG));
       IF CAMFLG≠0 THEN BEGIN EXFLAG←3; RETURN; END;
       SETCLIP; IF EXFLAG≠0 THEN RETURN;

       IF NCUT<0 THEN CUT←.7*MAXGRADG;
       SINVAL←DELF; IF SINVAL<3*DOFREQ THEN SINVAL←3*DOFREQ;
       X←XMIN←CAMRANG-SINVAL/2; XMAX←XMIN+SINVAL; 
       XDELTA←SINVAL/(N←10); 

       OUTSTR("FOCDRAW: FOCUS CURVE BEING COMPILED WITH CUT="&CVS(CUT)CRLF);
       OUTSTR("         SINVAL="&CVG(SINVAL)&" RANG="&CVG(RANG)&
              " DELF="&CVG(DELF)&" DOFREQ="&CVG(DOFREQ)CRLF);
       MAGAV[0]←PEAKMAG[1,1]←PEAKMAG[2,1]←PEAKMAG[3,1]←0;

       FOR I←1 STEP 1 UNTIL N DO BEGIN  
           MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(X));
           IF CAMFLG≠0 THEN BEGIN EXFLAG←3; RETURN; END;
           DIST[I]←CAMRANG;
           INPUT; IF EXFLAG≠0 THEN RETURN; ⊃ Very important!;
	   TVSCREEN(MAXGRAD[I],MAGAV[I]);
           IF MAGAV[I]>MAGAV[0] THEN MAXGRADG←MAXGRAD[I];

           IF   MAGAV[I]>PEAKMAG[3,1]     
           THEN IF   MAGAV[I]>PEAKMAG[2,1]     
	        THEN IF   MAGAV[I]>PEAKMAG[1,1]     
	             THEN BEGIN INTEGER Z;
			  FOR Z←3 STEP -1 UNTIL 2 DO BEGIN
	          	      PEAKMAG[Z,1]←PEAKMAG[Z-1,1];
			      PEAKMAG[Z,2]←PEAKMAG[Z-1,2]; END;
			  PEAKMAG[1,1]←MAGAV[0]←MAGAV[I];
			  PEAKMAG[1,2]←RANG←CAMRANG; END
	             ELSE BEGIN PEAKMAG[3,1]←PEAKMAG[2,1];
			        PEAKMAG[3,2]←PEAKMAG[2,2];
			        PEAKMAG[2,1]←MAGAV[I]; PEAKMAG[2,2]←CAMRANG;
			  END
                ELSE BEGIN PEAKMAG[3,1]←MAGAV[I]; PEAKMAG[3,2]←CAMRANG; END;

	   IF I>1 THEN BEGIN
	      FOR J←I-1 STEP -1 UNTIL 1 DO
		  IF   DIST[J]>DIST[J+1]
		  THEN BEGIN DIST[J]↔DIST[J+1]; MAGAV[J]↔MAGAV[J+1];
	               MAXGRAD[J]↔MAXGRAD[J+1]; END
		  ELSE DONE; END;

           X←X+XDELTA;     	 END;
       IF DIS_FOC THEN BEGIN
       DPYSET(DPYBUF); DPYTYP(-200,10,1);
       ⊃ lables the table;
       AIVECT(-511,360); DPYSST("  MAGAV  MAXGRAD      X  ");
       ⊃ displays table and vertical scale lines;
       FOR I←1 STEP 1 UNTIL N DO  BEGIN
           AIVECT(-511,360-I*40);
           DPYSST(CVS(MAGAV[I])&CVS(MAXGRAD[I])&"  "&CVF(DIST[I]));
	   AIVECT(-210,380-I*40); RVECT(20,0); END;
       ⊃ compute the plotting scales;
       XMULT←600.0/MAGAV[0]; YMULT←360.0/(DIST[10]-DIST[1]);
       ⊃ plots the axes;
       AIVECT(-200,380); RVECT(0,-440); RVECT(660,0);
       ⊃ marks the criterion axis;
       FOR I←0 STEP 1 UNTIL 10 DO BEGIN
           AIVECT(-200+I*60,-50); RVECT(0,-20); RIVECT(-70,-30);
           DPYSST(CVS(I*10)&"%"); END;
       ⊃ inserts highest value and MAXGRADG;
       AIVECT(340,-150); DPYSST(CVS(MAGAV[0]));
       AIVECT(150,-150); DPYSST("MAXGRADG="&CVS(MAXGRADG));
       ⊃ plots the criterion;
       AIVECT(MAGAV[1]*XMULT-200,340);
       FOR I←2 STEP 1 UNTIL N DO
           RVECT((MAGAV[I]-MAGAV[I-1])*XMULT,-(DIST[I]-DIST[I-1])*YMULT);
       DPYOUT(1);      END;


	FOCSTRAT←ACOM_EVAL;
	IF FOCSTRAT=0 THEN BEGIN EXFLAG←4; RETURN; END;
	IF FOCSTRAT=1 THEN GO TO BOUNDIN ELSE 
	IF FINEFOC=2 THEN GO TO XIT;
	IF FOCSTRAT=2 THEN 
	   	IF DELF>DOFREQ THEN 
			BEGIN  FINEFOC←FINEFOC+1; GO TO BOUNDIN; END
			ELSE GO TO XIT; 

XIT:	MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_FOCUS(RANG));
	IF CAMFLG≠0 THEN BEGIN EXFLAG←2; RETURN; END;
	OUTSTR("FOCDRAW: RANG="&CVF(PEAKMAG[1,2])&
	       ", DELF="&CVF(DELF)CRLF);
	OUTSTR("FOCDRAW: FOCSTRAT="&CVS(FOCSTRAT)&
	       "   FINEFOC="&CVS(FINEFOC)CRLF);

	FOCRANG←RANG; FOCDELF←DELF;
  END "FOCDRAW";
  MESSAGE PROCEDURE AUTOFOC( REAL EST_RANG,RANGINVAL; INTEGER NCUT);
    BEGIN EXFLAG←0;
	  FOCDRAW(EST_RANG,RANGINVAL,NCUT);
	  FOCFLG←EXFLAG;
    END"AUTOFOC";

  ⊃ Main program;

  TVWORD←GIOWD(TVBUF);  INTPNT;
  DIS_FOC←TRUE; DEB_FOC←FALSE;
  SETFORMAT(6,3);

  PUT_DATA(0,0,"FOC");        ⊃ DECLARE YOUR NAME ;
  OUTSTR("FOC-ACTIVATED"CRLF);
  YES_FOC←TRUE ;
  WHILE TRUE DO BEGIN
        MESS ← GET_ENTRY ('120,NULL,"FOC",NULL);
        MESS ← QUEUE ('600,MESS); ⊃ ACTIVATE AND ACKNOWLEDGE ;
	        END;
END "GILFOC";